package priv.conceit.study.book.thread.chapter1.parts3;

/**
 * 1.3
 * 第一章第三节
 * 线程的生命周期详解
 * <p>
 * 线程的生命周期
 * new: 创建
 * runnable: 可运行
 * running: 运行
 * blocked: 阻塞
 * terminated: 终止
 *
 * @author Conceit
 * 2019/6/2 增加方法
 * @since 1.0.0, 2019/6/2
 */
public class ThreadLifecycle {


	/**
	 * 创建状态
	 * <p>
	 * 当我们使用new 关键字创建一个线程对象时，该线程并不会立即得到执行，因为没有使用start方法启动该线程
	 * 此时该线程对象 和普通的java对象没有什么差别
	 * 那么此时该线程对象的状态为new 状态，准确的说是Thread对象的一种自定义状态 threadStatus=0
	 * <p>
	 * new状态可进入状态
	 * 1-可以进入runnable状态
	 */
	public void news() {
	}

	/**
	 * 可运行状态
	 * 线程要想进入runnable状态就必须要使用start方法 启动线程
	 * 但是使用start方法 该线程对象也不会立即执行，因为线程和进程一样 它的运行与否要听令于cpu的调度
	 * 线程对象此时已经具备了运行资格，但是并没有真正的执行起来
	 * 我们把这种中间状态称之为可运行状态
	 * <p>
	 * 因为存在running状态，所以不会直接进入blocked状态和terminated状态
	 * 即使是在线程的执行逻辑中调用wait sleep或者其他block的io操作，也必须先获得cpu的调度执行才行。
	 * 所以严格的说
	 * <p>
	 * runnable状态可进入状态
	 * 1-runnable 状态可以进入running状态
	 * 2-或者意外终止
	 */
	public void runnable() {
	}


	/**
	 * 一旦cpu通过轮询或者其他方式从可执行队列中 选中了线程 那么线程才会真正执行自己逻辑代码
	 * running状态的线程实际上也是runnable状态，反之则不成立
	 * <p>
	 * running可进入状态
	 * 1-线程主动调用yield方法，主动放弃cpu执行权，进入runnable状态
	 * 2-cpu的调度器轮询使该线程放弃执行 进入runnable状态
	 * <p>
	 * 3-线程由于参与获取资源锁 而进入该锁的阻塞队列中 blocked状态
	 * 4-进行某个阻塞的io操作，比如因为网络数据的读写而进入了blocked状态
	 * 5-sleep 或者wait方法进入到了waitSet中 blocked状态
	 * <p>
	 * 6-调用jdk已经不推荐使用的stop方法 或者判断某个逻辑标识，直接进入terminated状态
	 */
	public void running() {
	}

	/**
	 * 阻塞状态
	 * <p>
	 * blocked可进入状态
	 * 1-直接进入terminated状态 比如调用过时方法stop或者意外死亡(jvm crash)
	 * <p>
	 * 2-线程阻塞的操作结束 比如io操作结束 进入runnable状态
	 * 3-线程完成了指定时间的休眠 进入runnable状态
	 * 4-wait中的线程被其他线程的 notify/notifyAll方法唤醒 进入了runnable状态
	 * 5-线程获得了锁资源 进入runnable状态
	 * 6-线程在阻塞过程中被打断，比如其他线程调用了interrupt方法 进入了runnable状态
	 */
	public void blocked() {

	}

	/**
	 * 终止状态
	 * terminated是一个线程的最终形态，在该状态线程不会切换到其他状态，意味着该线程的生命周期已经终结
	 * <p>
	 * 可进入terminated状态的情况(是可进入terminated!!!)
	 * 1-线程正常运行结束，结束线程生命周期
	 * 2-线程运行出错，意外退出
	 * 3-意外死亡(jvm crash) 所有线程结束
	 */
	public void terminated() {

	}
}
